# -*- coding: utf-8 -*-

# map reduce 将首字母大写 其余小写
nams = ["dave", "BoB", "liSA"]


def format_name(names):
    def toUp(s):
        return s[:1].upper()+s[1:].lower()
    return map(toUp, names)


print(list(format_name(nams)))


# 将str转化成int
from functools import reduce
maps = {"1": 1, "2": 2, "3": 3}

# reduce的计算过程 (（1*10+2)*10+3）


def to_int(n):
    def get_value(x, y):
        return x*10+y

    def get_number(number):
        return maps[number]

    return reduce(get_value, map(get_number, n))


print(to_int('123'))






# filter 过滤器
def not_empty(s):
    return s and s.strip()


# filter()函数返回的是一个Iterator，也就是一个惰性序列，所以要强迫filter()完成计算结果，需要用list()函数获得所有结果
print(list(filter(not_empty, ['A', '', 'B', None, 'C', '  '])))


# sorted 排序算法 可以接收一个key来自定义排序
numbers = [a for a in range(10)]
print(sorted(numbers, key=abs))

# 根据成绩进行排序
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]

def by_name(t):
    return t[1]

print(sorted(L, key=by_name))





#返回函数 函数不仅能作为参数 也能作为返回值

#函数不需要立即求和 而是返回求和函数
def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum
#返回的函数
f=lazy_sum(1,3,4,5)
print(f)
#实际调用
print(f())
#注意到返回的函数在其定义内部引用了局部变量args当返回sun的时候同时也返回了args，所以，当一个函数返回了一个函数后，其内部的局部变量还被新函数引用称为闭包






#匿名函数 (lambda args:option) 只能有一个option 不需要return关键字
print(list(map(lambda x:x*x,[1,3,4,5,6])))






#装饰器 函数扩展
#函数有个_name_属性 可以拿到函数的名字
def now():
    print('2018-06-23')
f=now
#获得函数名称
print(f.__name__)




#函数扩展·
def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

#给函数加上日志函数
@log
def now():
    print('2018-06-23')

#调用扩展的函数
now()

#如果装饰器本身也需要传入参数 可以借助高阶函数
def log(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

@log('execute')
def now():
    print('2015-3-25')
now()



#返回函数的名称已经改变为wrapper
print(now.__name__)
#Python内置的@functools.wraps 可以将原函数的属性自动复制

import functools
def log(text):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

@log('execute')
def now():
    print('2015-3-25')
now()
#原始函数名称属性
print(now.__name__)






#偏函数 Partial function 
#functools.partial的作用就是，把一个函数的某些参数给固定住（也就是设置默认值），返回一个新的函数
import functools
#int 的base参数可以指定为N进制转换 可以固定进制构造新的函数
int2=functools.partial(int,base=2)
print(int2('100'))






